home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / asm / fastsincos.lha / fastsincos / fastsincos.asm < prev    next >
Assembly Source File  |  2000-04-12  |  4KB  |  284 lines

  1.     incdir    asm:
  2.     include    exec/execbase.i
  3.     include    math.i
  4.     include    phxmacros.i
  5.  
  6.     mc68040
  7.  
  8.     xref    _SysBase
  9.     xref    _exit
  10.  
  11.     EXTERN_LIB    AllocVec
  12.     EXTERN_LIB    FreeVec
  13.  
  14.     section    sincos,code
  15.  
  16. ;Init table with polynomial coefficients
  17.  
  18.     xdef    _INIT_1_FastSincos
  19. _INIT_1_FastSincos
  20.     move.l    _SysBase,a6
  21.     move.w    AttnFlags(a6),d0
  22.     btst    #AFB_68040,d0
  23.     beq    .ret
  24.     move.l    #360*30*8*3,d0
  25.     moveq    #0,d1
  26.     callsys    AllocVec
  27.     move.l    d0,sintab
  28.     beq    .exit
  29.     move.l    #360*30*8*3,d0
  30.     moveq    #0,d1
  31.     callsys    AllocVec
  32.     move.l    d0,costab
  33.     beq    .exit
  34.     fmove.d    #PI180,fp0
  35.     fmul.d    #1.0/30.0,fp0
  36.     fmove.d    fp0,faktor1
  37.     fmove.s    #30,fp0
  38.     fmul.d    #1.0/PI180,fp0
  39.     fmove.d    fp0,faktor2
  40.     moveq    #0,d0
  41.     move.l    sintab,a0
  42.     move.l    costab,a1
  43.  
  44. .loop
  45.     move.w    d0,d1
  46.     add.w    #1,d1
  47.     fmove.w    d0,fp0
  48.     fmul.d    faktor1,fp0
  49.     fsincos.x    fp0,fp4:fp5
  50.     fmove.w    d1,fp1
  51.     fmul.d    faktor1,fp1
  52.     fsincos.x    fp1,fp6:fp7
  53.     fmove.x    fp6,fp3
  54.     fsub.x    fp4,fp3
  55.     fmul.s    #0.5,fp3 
  56.     fmul.d    faktor2,fp3
  57.     move.w    d0,d1
  58.     neg.w    d1
  59.     add.w    d1,d1
  60.     sub.w    #1,d1
  61.     fmove.w    d1,fp2
  62.     fmul.d    faktor1,fp2
  63.     fmul.d    faktor1,fp2 
  64.     fmul.x    fp3,fp2
  65.     fadd.x    fp7,fp2
  66.     fsub.x    fp5,fp2
  67.     fmul.d    faktor2,fp2
  68.     fmove.x    fp3,fp1
  69.     fmul.x    fp0,fp1
  70.     fadd.x    fp2,fp1
  71.     fmul.x    fp0,fp1
  72.     fneg.x    fp1
  73.     fadd.x    fp5,fp1
  74.     fmove.d    fp3,(a0)+
  75.     fmove.d    fp2,(a0)+
  76.     fmove.d    fp1,(a0)+
  77.     fmove.x    fp5,fp3
  78.     fsub.x    fp7,fp3
  79.     fmul.s    #0.5,fp3
  80.     fmul.d    faktor2,fp3
  81.     move.w    d0,d1
  82.     neg.w    d1
  83.     add.w    d1,d1
  84.     sub.w    #1,d1
  85.     fmove.w    d1,fp2
  86.     fmul.d    faktor1,fp2
  87.     fmul.d    faktor1,fp2
  88.     fmul.x    fp3,fp2
  89.     fadd.x    fp6,fp2
  90.     fsub.x    fp4,fp2
  91.     fmul.d    faktor2,fp2
  92.     fmove.x    fp3,fp1
  93.     fmul.x    fp0,fp1
  94.     fadd.x    fp2,fp1
  95.     fmul.x    fp0,fp1
  96.     fneg.x    fp1
  97.     fadd.x    fp4,fp1
  98.     fmove.d    fp3,(a1)+
  99.     fmove.d    fp2,(a1)+
  100.     fmove.d    fp1,(a1)+
  101.     add.w    #1,d0
  102.     cmp.w    #360*30,d0
  103.     blo    .loop
  104.  
  105. .ret
  106.     rts
  107.  
  108. .exit
  109.     pea    20
  110.     jsr    _exit
  111.  
  112.     xdef    _EXIT_1_FastSincos
  113. _EXIT_1_FastSincos
  114.     move.l    sintab,a1
  115.     callsys    FreeVec,SysBase
  116.     move.l    costab,a1
  117.     callsys    FreeVec
  118.     rts
  119.  
  120. costab
  121.     dc.l    0
  122. sintab
  123.     dc.l    0
  124.  
  125. faktor1
  126.     dc.d    0
  127. faktor2
  128.     dc.d    0
  129.  
  130.     section    fastsin___r_d,code
  131.  
  132.     xdef    fastsin___r_d
  133.     xdef    _fastsin__r
  134. fastsin___r_d
  135. _fastsin__r
  136.     pushm.l    d0/a0
  137.     fmove.d    12(sp),fp0
  138.     jsr    fastsin
  139.     popm.l    d0/a0
  140.     rts
  141.  
  142.     section    fastsin,code
  143.  
  144.     xdef    fastsin
  145. fastsin
  146.     fpush.x    fp1
  147.     ftst.x    fp0
  148.     fblt    .minus
  149.     fcmp.d    #TWOPI,fp0
  150.     fblt    .cont1
  151.     fmul.d    #1.0/TWOPI,fp0    ;this frac() is faster than fmod
  152.     fintrz.x    fp0,fp1
  153.     fsub.x    fp1,fp0
  154.     fmul.d    #TWOPI,fp0
  155.  
  156. .cont1
  157.     fmove.x    fp0,fp1
  158.     fmul.d    faktor2,fp0
  159.     fintrz.x    fp0
  160.     fmove.l    fp0,d0
  161.     divu.w    #360*30,d0    ;This is the bottleneck
  162.     tst.w    d0
  163.     beq    .nonull
  164.     fmove.s    #0,fp0
  165.     bra    .ret
  166.  
  167. .nonull
  168.     swap    d0
  169.     mulu.w    #24,d0
  170.     move.l    sintab,a0
  171.     add.l    d0,a0
  172.     fmove.d    (a0)+,fp0
  173.     fmul.x    fp1,fp0
  174.     fadd.d    (a0)+,fp0    
  175.     fmul.x    fp1,fp0
  176.     fadd.d    (a0),fp0
  177.  
  178. .ret
  179.     fpop.x    fp1
  180.     rts
  181.  
  182. .minus
  183.     fabs.x    fp0
  184.     fcmp.d    #TWOPI,fp0
  185.     fblt    .cont2
  186.     fmul.d    #1.0/TWOPI,fp0    ;this frac() is faster than fmod
  187.     fintrz.x    fp0,fp1
  188.     fsub.x    fp1,fp0
  189.     fmul.d    #TWOPI,fp0
  190.  
  191. .cont2
  192.     fmove.x    fp0,fp1
  193.     fmul.d    faktor2,fp0
  194.     fintrz.x    fp0    ;This one is required. Dont skip it !
  195.     fmove.l    fp0,d0
  196.     divu.w    #360*30,d0    ;This is the bottleneck
  197.     tst.w    d0
  198.     beq    .mnonull
  199.     fmove.s    #0,fp0
  200.     bra    .ret
  201.  
  202. .mnonull
  203. ;evaluate value from coefficient table
  204.     swap    d0
  205.     mulu.w    #24,d0
  206.     move.l    sintab,a0
  207.     add.l    d0,a0
  208.     fmove.d    (a0)+,fp0
  209.     fmul.x    fp1,fp0
  210.     fadd.d    (a0)+,fp0    
  211.     fmul.x    fp1,fp0
  212.     fadd.d    (a0),fp0
  213.     fneg.x    fp0
  214.     fpop.x    fp1
  215.     rts
  216.  
  217.     section    fastcos___r_d,code
  218.  
  219.     xdef    fastcos___r_d
  220.     xdef    _fastcos__r
  221. fastcos___r_d
  222. _fastcos__r
  223.     pushm.l    d0/a0
  224.     fmove.d    12(sp),fp0
  225.     jsr    fastcos
  226.     popm.l    d0/a0
  227.     rts
  228.  
  229.     section    fastcos,code
  230.  
  231.     xdef    fastcos
  232. fastcos
  233.     fpush.x    fp1
  234.     fabs.x    fp0
  235.     fcmp.d    #TWOPI,fp0
  236.     fblt    .cont
  237.  
  238. ;replaces fmod on a 040/060
  239.     fmul.d    #1.0/TWOPI,fp0
  240.     fintrz.x    fp0,fp1
  241.     fsub.x    fp1,fp0
  242.     fmul.d    #TWOPI,fp0
  243.  
  244. .cont
  245.     fmove.x    fp0,fp1
  246.     fmul.d    faktor2,fp0
  247.     fintrz.x    fp0    ;This one is required. Dont skip it !
  248.     fmove.l    fp0,d0
  249.     divu.w    #360*30,d0    ;This is the bottleneck
  250.     tst.w    d0
  251.     beq    .nonull
  252.     fmove.s    #1,fp0
  253.     bra    .ret
  254.  
  255. .nonull
  256. ;evaluate value from coefficient table
  257.     swap    d0
  258.     mulu.w    #24,d0
  259.     move.l    costab,a0
  260.     add.l    d0,a0
  261.     fmove.d    (a0)+,fp0
  262.     fmul.x    fp1,fp0
  263.     fadd.d    (a0)+,fp0
  264.     fmul.x    fp1,fp0
  265.     fadd.d    (a0),fp0
  266.  
  267. .ret
  268.     fpop.x    fp1
  269.     rts
  270.  
  271.     section    fastsincos__dRdRd,code
  272.  
  273.     xdef    fastsincos__dRdRd
  274. fastsincos__dRdRd
  275.     fmove.d    4(sp),fp0
  276.     jsr    fastsin
  277.     movem.l    12(sp),a0-a1
  278.     fmove.d    fp0,(a0)
  279.     fmove.d    4(sp),fp0
  280.     jsr    fastcos
  281.     fmove.d    fp0,(a1)
  282.     rts
  283.  
  284.